////虚析构函数--- delete一个基类类型指针（指向子类对象）,能够正确的调用子类的析构函数
////typeid操作符--获取对象的类型信息
//
//#include <iostream>
//#include <fcntl.h>
//#include <unistd.h>
//using namespace std;
//class A {
//public:
//	A() :m_a (open("./file", O_CREAT | O_RDWR, 0664)) {
//		//[int m_a = open(...)] 定义m_a,初值为文件描述符-->文件表等内核信息
//	}
//	virtual ~A() {//虚析构函数
//		//释放m_a本身所占内存空间
//		close(m_a);
//
//		cout << "~A()被调用--关闭file文件" << endl;
//	}
//private:
//	int m_a;
//};
//class B :public A {
//public:
//	B() :m_b(open("./cfg", O_CREAT | O_RDWR, 0644)) {
//		//[A();]//定义基类子对象，利用基类子对象.A()
//		//[int m_b = open(...);]定义m_b,初值为文件描述符-->文件表等内核信息（动态资源）
//		cout << "B()被调用--打开cfg文件" << endl;
//	}
//	~B() {//虚析构函数 只要基类虚构函数是虚函数，子类的析构一定是虚
//		close(m_b);
//		cout << "~B()被调用" << endl;
//		//对于基类子对象，利用基类子对象.~A()
//		//释放m_b/基类子对象本身所占空间
//	}
//
//private:
//	int m_b;
//};
//int main(void) {
//	B* p = new B;//定义B堆对像，利用B类堆对象.B()
//	delete p;//p->析构函数（~B()）释放B类堆对象本身所占内存空间
//	return 0;
//}